package com.ruoyi.web.controller.system;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.OrderInfo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.IOrderInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 订单信息管理控制器
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/orderInfo")
public class OrderInfoController extends BaseController {

    @Autowired
    private IOrderInfoService orderInfoService;

    /**
     * 获取订单信息列表
     */
    @GetMapping("/list")
    public TableDataInfo list(OrderInfo orderInfo) {
        startPage();
        List<OrderInfo> list = orderInfoService.selectOrderInfoList(orderInfo);
        return getDataTable(list);
    }

    /**
     * 根据订单ID获取详细信息
     */
    @GetMapping(value = { "/", "/{id}" })
    public AjaxResult getInfo(@PathVariable(value = "id", required = false) Long id) {
        if (StringUtils.isNotNull(id)) {
            // 数据权限校验（如需）
            // orderInfoService.checkDataScope(id);
        }
        return AjaxResult.success(orderInfoService.selectOrderInfoById(id));
    }

    /**
     * 新增订单信息
     */
    @Log(title = "订单信息", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody OrderInfo orderInfo) {
        // 设置创建人信息
//        orderInfo.setCreateBy(SecurityUtils.getUsername());
        return toAjax(orderInfoService.insertOrderInfo(orderInfo));
    }

    /**
     * 修改订单信息
     */
    @Log(title = "订单信息", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody OrderInfo orderInfo) {
        // 数据权限校验
        // orderInfoService.checkDataScope(orderInfo.getId());

        // 设置更新人信息
//        orderInfo.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(orderInfoService.updateOrderInfo(orderInfo));
    }

    /**
     * 删除订单信息
     */
//    @Log(title = "订单信息", businessType = BusinessType.DELETE)
//    @DeleteMapping("/{ids}")
//    public AjaxResult remove(@PathVariable Long[] ids) {
//        // 校验是否允许删除（如订单状态是否允许删除）
//        // if (orderInfoService.hasAssociatedData(ids)) {
//        //     return error("所选订单存在关联数据，无法删除");
//        // }
//        return toAjax(orderInfoService.deleteOrderInfoByIds(ids));
//    }

    /**
     * 分页查询（支持字段模糊查询）
     */
    @GetMapping("/page")
    public TableDataInfo pageQuery(OrderInfo orderInfo) {
        startPage();
        List<OrderInfo> list = orderInfoService.selectOrderInfoList(orderInfo);
        return getDataTable(list);
    }

    /**
     * 更新订单信息
     */
    @PostMapping("/update")
    public AjaxResult update(@Validated @RequestBody OrderInfo orderInfo) {
        // 数据权限校验
        // orderInfoService.checkDataScope(orderInfo.getId());

        // 设置更新人信息
//        orderInfo.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(orderInfoService.updateOrderInfo(orderInfo));
    }

    /**
     * 获取订单下拉框数据
     * 返回格式: [{"value": 1, "label": "订单编号1"}, {"value": 2, "label": "订单编号2"}]
     */
    @GetMapping("/options")
    public AjaxResult getOrderOptions() {
        // 查询所有有效订单
        List<OrderInfo> orders = orderInfoService.selectOrderInfoList(new OrderInfo());

        // 转换为下拉框所需格式
        List<Map<String, Object>> options = orders.stream()
                .map(order -> {
                    Map<String, Object> option = new HashMap<>();
                    option.put("value", order.getId());
                    option.put("label", order.getBusOrderNum()); // 使用业务订单编号作为显示文本
                    return option;
                })
                .collect(Collectors.toList());

        return AjaxResult.success(options);
    }
}
